/*
 * FilePath     : \src\hooks\useMQMessage.ts
 * Author       : 苏军志
 * Date         : 2024-01-16 08:32
 * LastEditors  : 苏军志
 * LastEditTime : 2024-01-16 09:25
 * CodeIterationRecord: MQ消息处理
 */

/**
 * MQ消息处理
 */
export function useMQMessage() {
  /**
   * @description: 根据消息类型显示消息
   * @param message
   * @return
   */
  const displayMessage = (message: MQMessage) => {
    const messageContent: string = parseMessageContent(message);
    if (!messageContent) {
      return;
    }
    switch (message.Type) {
      case MQMessageType.Alert:
        showAlert("success", messageContent);
        break;
      case MQMessageType.Message:
        showMessage("success", messageContent);
        break;
      case MQMessageType.Confirm:
        confirmBox(messageContent, "");
        break;
      case MQMessageType.Notification:
        showNotification(messageContent, "", 0, () => message.Link && (location.href = message.Link));
        break;
      default:
        showMessage("success", messageContent);
        break;
    }
  };
  /**
   * @description: 解析消息内容
   * @param message
   * @return
   */
  const parseMessageContent = (message: MQMessage): string => {
    let messageContent: string = "";
    if (typeof message.Message === "string") {
      messageContent = message.Message as string;
      return messageContent;
    }
    // 根据后端传的消息格式化参数解析消息
    if (message.MessageFormatter) {
      // 暂时用不到，先不写逻辑
      messageContent = JSON.stringify(message.Message);
      return messageContent;
    }
    messageContent = JSON.stringify(message.Message);
    return messageContent;
  };
  return {
    /**
     * @description: 根据员工编号订阅单人消息
     * @param employeeID 员工编号
     * @param callBack 回调函数，若不传走默认，否则 传入的回调
     * @return
     */
    createMQByEmployeeID(employeeID: string, callBack?: Function) {
      const { mqSetting, getMqClient } = useMQ();
      if (mqSetting.isOpen) {
        const mqClient = getMqClient();
        // 订阅单人MQ消息
        mqClient.receive(employeeID, (message: MQMessage) => {
          if (callBack) {
            callBack(message);
          } else {
            displayMessage(message);
          }
        });
      }
    },
    /**
     * @description: 根据交换机和条件订阅广播消息
     * @param exchangeName 路由键
     * @param routingKey 仅在消息发送类型为广播时可用，路由键/条件
     *  限定为一个由`.`分隔的字符串，其中每词可以包含如下两种特殊字符
     * *：匹配一个字符 eg:*.orage.*：匹配orange开头和结尾的单词
     * #：匹配0~n个字符 eg:lazy.#：匹配lazy开头的单词
     * #: 如果路由模式仅是一个井号 (#)，那么它将匹配所有的 routing keys。
     * @param callBack 回调函数，若不传走默认，否则 传入的回调
     * @return
     */
    createMQByBroadcast(exchangeName: string, routingKey?: string, callBack?: Function) {
      const { mqSetting, getMqClient } = useMQ();
      if (mqSetting.isOpen) {
        const mqClient = getMqClient();
        // 订阅广播MQ消息
        mqClient.subscribe(exchangeName, routingKey, (message: MQMessage) => {
          if (callBack) {
            callBack(message);
          } else {
            displayMessage(message);
          }
        });
      }
    }
  };
}
